﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.View
{
    public partial class frmAggiungiCorso : Form
    {
        private Utente user;
        private StatoForm stato;
        private ctrlCorso ctrlCorso = new ctrlCorso();
        private Corso corso;
        frmElencoCorsi elenco;

        public frmAggiungiCorso(Utente user, frmElencoCorsi elenco, StatoForm status, Corso corso = null)
        {
            InitializeComponent();
            stato = status;
            this.elenco = elenco;
            this.corso = corso;
            SettaStato(stato);
            this.user = user;
        }

        private void SettaStato(StatoForm status)
        {
            switch (status)
            {
                case StatoForm.Lettura:
                    this.Text = "Corso - Lettura";
                    AbilitaDisabilita(false);
                    RiempiCampi(corso);
                    break;
                case StatoForm.Modifica:
                    this.Text = "Corso - Modifica";
                    RiempiCampi(corso);
                    AbilitaDisabilita(true);
                    break;
                case StatoForm.Nuovo:
                    this.Text = "Corso - Nuovo";
                    corso = new Corso();
                    AbilitaDisabilita(true);
                    txtCodice.Clear();
                    txtNome.Clear();
                    upNumeroOre.Value = 0;
                    dtpDataInizio.Value = Convert.ToDateTime(DateTime.Now.ToShortDateString());
                    break;
            }
        }

        #region Eventi

        private void btnSalva_Click(object sender, EventArgs e)
        {
            #region Controlli TextBox

            if (string.IsNullOrEmpty(txtCodice.Text))
            {
                MessageBox.Show("La casella Codice non può essere Vuota", "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtCodice.Focus();
                return;
            }
            if (string.IsNullOrEmpty(txtNome.Text))
            {
                MessageBox.Show("La casella Nome non può essere Vuota", "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtNome.Focus();
                return;
            }
            if (string.IsNullOrEmpty(upNumeroOre.Value.ToString()))
            {
                MessageBox.Show("La casella Durata Ore non può essere Vuota", "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                upNumeroOre.Focus();
                return;
            }

            #endregion Controlli TextBox

            if (!BadgeManager.Properties.Settings.Default.chkConsideraSabato || !BadgeManager.Properties.Settings.Default.chkConsideraDomenica)
            {
                if (dtpDataInizio.Value.DayOfWeek == DayOfWeek.Saturday || dtpDataInizio.Value.DayOfWeek == DayOfWeek.Sunday)
                {
                    MessageBox.Show("Hai selezionato un giorno di inzio pari a un festivo. Sarà automaticamente impostato il lunedì successivo.");
                }
            }
            corso.Codice = txtCodice.Text.Trim();
            corso.DataInizio = new ctrlAttivitaDettaglio(null).getGiornoDopoValido(dtpDataInizio.Value);
            corso.Nome = txtNome.Text.Trim();
            corso.NumeroOre = Convert.ToInt32(upNumeroOre.Value);

            if (stato == StatoForm.Nuovo)
            {
                if (VerificaEsistente())
                {
                    MessageBox.Show("Corso esistente", "ATTENZIONE!", MessageBoxButtons.OK,
                        MessageBoxIcon.Information);
                    return;
                }
                try
                {
                    ctrlCorso.Inserisci(corso);
                }
                catch (ImpossibileInserire ex)
                {
                    MessageBox.Show(ex.Message + "/n Corso non inserito"
                        , "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                MessageBox.Show("Salvataggio Riuscito");
            }
            else if (stato == StatoForm.Modifica)
            {
                try
                {
                    if (ctrlCorso.ControllaSeInAttività(corso.Id) > 0)
                    {
                        if (ctrlCorso.VerificaSeDataModificata(corso))
                        {
                            DialogResult result = MessageBox.Show("Il corso Modificato è attualmente inserito in un'Attività. Modificarla ?",
                                    "Attenzione!", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                            if (result == System.Windows.Forms.DialogResult.Yes)
                            {
                                ctrlCorso.Update(corso);
                                if (elenco != null)
                                    elenco.Close();
                                this.Close();
                                frmAttivitaDett frm = new frmAttivitaDett(user, new ctrlAttivita(null).SelectAttivitaByCorsoStanza(corso),
                                    StatoForm.Modifica, null, this);
                                frm.Left = 20;
                                frm.Top = 20;
                                frm.MdiParent = this.MdiParent;
                                frm.Show();
                            }
                            else
                                return;
                        }
                        else
                        {
                            MessageBox.Show("Niente da modificare", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else
                    {
                        ctrlCorso.Update(corso);
                        MessageBox.Show("Modifica Riuscita", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        if (elenco != null)
                            elenco.AggiornaDaEsterni(corso);
                    }
                    this.Close();
                    return;
                }
                catch (ImpossibileModificare ex)
                {
                    MessageBox.Show(ex.Message + "/n Corso non Modificato"
                        , "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            txtCodice.Clear();
            txtNome.Clear();
            if (elenco != null)
                elenco.AggiornaDaEsterni(corso);

            //frmAttivita.Istance(null, stato, null, null).AggiornaCorsiDaEsterno();
            this.Close();
        }

        #endregion Eventi

        #region Metodi Vari

        private void RiempiCampi(Corso corso)
        {
            txtCodice.Text = corso.Codice;
            txtNome.Text = corso.Nome;
            upNumeroOre.Value = corso.NumeroOre;
            dtpDataInizio.Value = corso.DataInizio;
        }

        private void AbilitaDisabilita(bool stato)
        {
            txtCodice.Enabled = stato;
            txtNome.Enabled = stato;
            upNumeroOre.Enabled = stato;
            dtpDataInizio.Enabled = stato;
            btnSalva.Enabled = stato;
        }

        private bool VerificaEsistente()
        {
            List<Corso> corsi = ctrlCorso.SelectAll();
            foreach (Corso corsoEsistente in corsi)
            {
                if (corsoEsistente.Equals(corso))
                {
                    return true;
                }
            }
            return false;
        }

        #endregion Metodi Vari

        private void cmdAnnulla_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void dtpDataInizio_ValueChanged(object sender, EventArgs e)
        {
        }
    }
}